/**
 * @file database_config.h
 * @brief 数据库配置应用层 - 将config模块的配置应用到数据库连接
 * @author liyingcheng <1871304538@qq.com>
 * @date 2025-10-12
 *
 * 职责说明：
 * - config模块负责：配置加载（读文件、环境变量、JSON解析）
 * - database_config模块负责：配置应用（转换、验证、传递给连接池）
 *
 * 不要在此模块中实现LoadFromFile/LoadFromJson等配置加载逻辑！
 */

#pragma once

#include "config/config.h" // 使用config模块的配置定义
#include <string>

namespace cpp_backend
{
    namespace database
    {

        // 复用config模块的配置结构
        using MySQLConfig = config::MySQLConfig;
        using RedisConfig = config::RedisConfig;

        /**
         * @brief 数据库配置应用器
         *
         * 职责：
         * 1. 从config模块获取配置
         * 2. 应用环境变量覆盖
         * 3. 验证配置有效性
         * 4. 提供配置给连接池使用
         *
         * 不负责：
         * - 读取配置文件（由config模块负责）
         * - JSON解析（由config模块负责）
         */
        class DatabaseConfig
        {
        public:
            /**
             * @brief 获取单例实例
             */
            static DatabaseConfig &Instance();

            /**
             * @brief 从config模块应用配置
             * @param config 全局配置对象
             * @return 是否应用成功
             */
            bool ApplyConfig(const config::Config &config);

            /**
             * @brief 应用环境变量覆盖（可选）
             * @return 是否应用成功
             */
            bool ApplyEnvironmentOverrides();

            /**
             * @brief 获取MySQL配置
             */
            const MySQLConfig &GetMySQLConfig() const { return mysql_config_; }

            /**
             * @brief 获取Redis配置
             */
            const RedisConfig &GetRedisConfig() const { return redis_config_; }

            /**
             * @brief 设置MySQL配置
             */
            void SetMySQLConfig(const MySQLConfig &config) { mysql_config_ = config; }

            /**
             * @brief 设置Redis配置
             */
            void SetRedisConfig(const RedisConfig &config) { redis_config_ = config; }

            /**
             * @brief 打印配置信息（隐藏密码）
             */
            std::string ToString() const;

            /**
             * @brief 验证配置有效性
             */
            bool ValidateConfig() const;

        private:
            DatabaseConfig() = default;
            ~DatabaseConfig() = default;
            DatabaseConfig(const DatabaseConfig &) = delete;
            DatabaseConfig &operator=(const DatabaseConfig &) = delete;

            MySQLConfig mysql_config_;
            RedisConfig redis_config_;
        };

    } // namespace database
} // namespace file_server
